import { message } from 'antd';
import axios, { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios';
import { debounce } from 'lodash';
import { downloadFileBlob } from './utils';

const axiosConfig: AxiosRequestConfig<any> = {
  // `baseURL` 将自动加在 `url` 前面，除非 `url` 是一个绝对 URL。
  // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
  baseURL: process.env.APP_API_URL,
  timeout: 180000,
};
const http = axios.create(axiosConfig);
const logout = debounce((msg) => {
  console.log('登录', msg);
}, 500);

// 请求拦截器
http.interceptors.request.use(
  async (config) => {
    return config;
  },
  (error) => {
    return Promise.reject(error);
  },
);

// 响应拦截器
http.interceptors.response.use(
  async (response: AxiosResponse<API.IResponse<any>>): Promise<API.IResponse<any> | any> => {
    const responseData: API.IResponse<any> = response.data;

    // 如果是文件，自动下载
    if (
      response.data instanceof Blob ||
      (response.headers['content-disposition'] &&
        response.headers['content-disposition'].indexOf('attachment') > -1)
    ) {
      const disposition = response.headers['content-disposition'];
      if (disposition) {
        const filename = disposition.split('filename=')[1];
        downloadFileBlob(response.data as any, filename);
        return Promise.resolve(response);
      }
    }

    // 成功正常返回数据
    if (responseData.code === 200) {
      // 这里返回的是 IResponse<T> 中的 T
      return Promise.resolve(responseData.data);
    }

    // token过期处理
    if ([10006].includes(responseData.code)) {
      // @ts-ignore 检测到未登录，是否不做处理直接返回，默认为 false
      if (!response.config.notAuthLogin) {
        logout(responseData.error);
      }
      return Promise.reject(responseData);
    }

    // @ts-ignore 是否隐藏错误提示，默认为 false
    if (!response.config.hideErrorMsg) {
      message.error(responseData.error || '服务端返回错误');
    }

    return Promise.reject(responseData);
  },
  (error: AxiosError) => {
    message.error(`接口请求异常: ${error.response?.statusText || '未知错误'}`);
    return Promise.reject(error);
  },
);
export default http;
